#pragma once

#include <cstddef>
#include <cstdint>
#include"common.h"
// #include"LRU-replacer.h"

// 缓冲池中页帧的编号
using frame_id_t = int32_t;


/**
 * @brief Replacer（替换器）抽象基类
 *
 * 负责在缓冲池满时选择一个“受害者”帧（frame）用于替换。
 * 只管理 pin_count == 0 的页帧（即可被淘汰的页）。
 */
class Replacer {
public:
  /** 虚析构函数，确保派生类正确析构 */
  virtual ~Replacer() = default;

  /**
   * 通知替换器：一个页帧现在可以被替换（pin_count 变为 0）
   *
   * @param frame_id 页帧 ID
   */
  virtual void Insert(frame_id_t frame_id) = 0;

  /**
   * 获取一个受害者帧（用于加载新页）
   *
   * @param[out] frame_id 输出参数：选中的受害者帧 ID
   * @return bool 成功返回 true，无可用帧返回 false
   */
  virtual bool Victim(frame_id_t* frame_id) = 0;

  /**
   * 从替换器中移除指定帧（例如该页被删除或重新 pin）
   *
   * @param frame_id 要移除的帧 ID
   * @return bool 是否成功移除（通常用于断言调试）
   */
  virtual bool Erase(frame_id_t frame_id) = 0;

  /**
   * 获取当前可替换的帧数量（即候选集大小）
   *
   * @return size_t 可替换帧的数量
   */
  virtual size_t Size() = 0;
};